/*
 * TcpServerConn.h
 *
 *   Created on: 2010-1-28     
 *  Description: 处理每一次Client与TcpServer的连接
 *    Copyright: 2010 @ ICT Li Heyuan
 */

#ifndef TCPSERVERCONN_H_
#define TCPSERVERCONN_H_

#include "../net/Network.h"
#include "../server/Server.h"
#include "Conn.h"

#include <string>

class TcpConn: public Conn
{
public:
	/* 构造函数
	 * @param server TcpServer的引用
	 * @param sock socket的fd
	 */
	TcpConn(Server* server, int sock, const EasyAddr &addr);
	virtual ~TcpConn();

	/* 根据TCP_Server的rpc通讯协议，处理Event和Stage的状态转移
	 * @param event 由epoll产生的事件
	 */
	virtual bool handle(unsigned int event);

	//智能指针需要
	const char* GetClassName() const
	{
		return "TcpConn";
	}

	//工作状态机
	enum
	{
		STAGE_READ, STAGE_EXECUTE, STAGE_WRITE, STAGE_FINISH
	};

private:
	/* 把数据读入缓存，并判断是否读取了完整的json_rpc request
	 * @return 需要继续监听返回true，不需要（关闭）返回false
	 */
	bool handle_read();

	/* read完毕，执行rpc方法
	 * @return 需要继续监听返回true，不需要（关闭）返回false
	 */
	void handle_execute();

	/* 把rpc method产生的response写入到sock中
	 * @return 需要继续监听返回true，不需要（关闭）返回false
	 */
	bool handle_write();

	/* JobPoll执行method后，callback这里，进行response前最后的处理并转入STAGE_WRITE或STAGE_FINISH
	 */
	void handle_execute_finish();

protected:
	//当前的状态
	unsigned int _stage;

	//recv数据的缓存
	std::string _rcvBuf;
	//send数据的缓存
	std::string _sendBuf;
	//还剩余多少要写入
	unsigned long _nSendLeft;
};

#endif /* TCPSERVERCONN_H_ */
